package web

import (
	"github.com/gin-gonic/gin"
	"jk-time/webook/internal/service/oauth2/github"
)

type OAuth2GithubHandler struct {
	commonOauth *CommonOauth
}

func NewOAuth2GithubHandler(svc *github.GitService) *OAuth2GithubHandler {
	return &OAuth2GithubHandler{
		commonOauth: NewCommonOauth(svc),
	}
}
func (h *OAuth2GithubHandler) RegisterRoutes(server *gin.Engine) {
	g := server.Group("/oauth2/github")
	g.GET("/authurl", h.AuthURL)
	g.POST("/callback", h.Callback)
}
func (h *OAuth2GithubHandler) AuthURL(ctx *gin.Context) {
	//state := uuid.New()
	//url, err := h.svc.AuthURL(ctx, state)
	//if err != nil {
	//	ctx.JSON(http.StatusOK, Result{
	//		Code: 5,
	//		Msg:  "构造第三方登录失败",
	//	})
	//	return
	//}
	//
	//err = h.setTokenCookie(ctx, state, err)
	//if err != nil {
	//	ctx.JSON(http.StatusOK, Result{
	//		Code: 5,
	//		Msg:  "系统错误",
	//	})
	//	zap.L().Error("setTokenCookie失败:", zap.Error(err))
	//	return
	//}
	//ctx.JSON(http.StatusOK, Result{
	//	Data: url,
	//})
	//return
	h.commonOauth.AuthURL(ctx, "/oauth2/github/callback")
}

//	func (h *OAuth2GithubHandler) setTokenCookie(ctx *gin.Context, state string, err error) error {
//		//校验state, state始终一致
//		stateToken := jwt.NewWithClaims(jwt.SigningMethodHS512, &StateClaims{
//			State: state,
//			RegisteredClaims: jwt.RegisteredClaims{
//				ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Minute * 3)),
//			},
//		})
//		stateTokenStr, err := stateToken.SignedString([]byte(h.StateKey))
//		if err != nil {
//			return fmt.Errorf("token签名失败,%w", err)
//		}
//		ctx.SetCookie("jwt-state", stateTokenStr, 600, "/oauth2/github/callback",
//			"", false, true)
//		return nil
//	}
func (h *OAuth2GithubHandler) Callback(ctx *gin.Context) {
	//校验state
	//err := h.verify(ctx)
	//if err != nil {
	//	ctx.JSON(http.StatusOK, Result{
	//		Code: 5,
	//		Msg:  "系统错误",
	//	})
	//	zap.L().Error("校验失败:", zap.Error(err))
	//	return
	//}
	//// 临时授权码，去获取真正的授权码
	//code := ctx.Query("code")
	//info, err := h.svc.VerifyCode(ctx, code)
	//if err != nil {
	//	ctx.JSON(http.StatusOK, Result{
	//		Code: 5,
	//		Msg:  "系统错误",
	//	})
	//	zap.L().Error("获取真正授权码失败:", zap.Error(err))
	//	return
	//}
	//u, err := h.svc.FindOrCreateByInfo(ctx, info)
	//if err != nil {
	//	ctx.JSON(http.StatusOK, Result{
	//		Code: 5,
	//		Msg:  "系统错误",
	//	})
	//	zap.L().Error("创建或生成用户信息失败:", zap.Error(err))
	//	return
	//}
	//
	//err = h.SetLoginToken(ctx, u.Id)
	//if err != nil {
	//	ctx.JSON(http.StatusOK, Result{
	//		Code: 5,
	//		Msg:  "系统错误",
	//	})
	//	zap.L().Error("生成登录token失败:", zap.Error(err))
	//	return
	//}
	//ctx.JSON(http.StatusOK, Result{
	//	Msg: "OK",
	//})
	h.commonOauth.Callback(ctx)
}

//func (h *OAuth2GithubHandler) verify(ctx *gin.Context) error {
//	state := ctx.Query("state")
//	//校验一下我的state
//	ck, err := ctx.Cookie("jwt-state")
//	if err != nil {
//		return fmt.Errorf("拿不到原始的error,%w", err)
//	}
//
//	var stateClaims StateClaims
//	stateToken, err := jwt.ParseWithClaims(ck, &stateClaims, func(token *jwt.Token) (interface{}, error) {
//		return h.StateKey, nil
//	})
//	if err != nil || !stateToken.Valid {
//		return fmt.Errorf("token 已经过期,%w", err)
//	}
//	if stateClaims.State != state {
//		return errors.New("state 不相等")
//	}
//	return nil
//}
